// 爱丽丝和鲍勃一起玩游戏，他们轮流行动。爱丽丝先手开局。

// 最初，黑板上有一个数字 N 。在每个玩家的回合，玩家需要执行以下操作：

// 选出任一 x，满足 0 < x < N 且 N % x == 0 。
// 用 N - x 替换黑板上的数字 N 。
// 如果玩家无法执行这些操作，就会输掉游戏。

// 只有在爱丽丝在游戏中取得胜利时才返回 True，否则返回 false。假设两个玩家都以最佳状态参与游戏。

//  

// 示例 1：

// 输入：2
// 输出：true
// 解释：爱丽丝选择 1，鲍勃无法进行操作。
// 示例 2：

// 输入：3
// 输出：false
// 解释：爱丽丝选择 1，鲍勃也选择 1，然后爱丽丝无法进行操作。
//  

// 提示：

// 1 <= N <= 1000

/* 找规律
N = 1 的时候，区间 (0, 1) 中没有整数是 n 的因数，所以此时 Alice 败。
N = 2 的时候，Alice 只能拿 1，N 变成 1，Bob 无法继续操作，故 Alice 胜。
N = 3 的时候，Alice 只能拿 1，N 变成 2，根据 N=2 的结论，我们知道此时 Bob 会获胜，Alice 败。
N = 4 的时候，Alice 能拿 1 或 2，如果 Alice 拿 1，根据 N=3 的结论，Bob 会失败，Alice 会获胜。
N = 5 的时候，Alice 只能拿 1，根据 N=4 的结论，Alice 会失败。
......
N 为奇数的时候 Alice（先手）必败，N 为偶数的时候 Alice 必胜。
*/
class Solution {
public:
    bool divisorGame(int N) {
        return N % 2 == 0;
    }
};

/* 递归
f[i]表示当前数字i的时候先手是出于必胜还是必败
*/
class Solution {
public:
    bool divisorGame(int N) {
        vector<int> f(N + 2, false);
        f[1] = false;
        f[2] = true;
        for (int i{3}; i <= N; ++i) {
            for (int j{1}; j < i; ++i) { // 枚举比i小的数字，看是否有必败
                if ((i % j == 0) && (f[i - j] == false)) {
                    f[i] = true;
                    break;
                }
            }
        }
        return f[N];
    }
};